Загрузим данные из кода в Jupyter Notebook.
players_df <- as.data.frame(read.csv('top_players.csv'))
Анализ посчитаных расстояний будем выполнять с помощью построения зависимости между points и average. Как видно из графика мы снова получаем самые важные кластеры 2, 6, 7. На этом графике благодаря прозрачности точек можно увидеть, что плотность точек внизу выше. Следовательно более короткое расстояние позволяет защищать и блокировать лучше.
pl_df <- na.omit(players_df)
p <- ggplot(pl_df, aes(average, points)) +
geom_point(mapping=aes(colour=as.factor(points_cnt)), alpha=0.2) +
geom_smooth(method = "lm", se=FALSE) +
ggtitle("Dependence of points by player") +
xlab("Distance") +
ylab("Points") +
labs(colour="Cluster")
ggplotly(p)
Точки, скопившиеся в районе average=0, это значения, для которых еще не были подсчитаны средние расстояния. Однако, для них мы имеем значения points и можем их учитывать. Добавление этим строкам значений average только усилит зависимость points и average.
Построим функцию плотности для average. Для этого выделим категории в позициях игроков, аналогично части про BMI.
defence_df <- pl_df
defence_df['category'] <- ifelse(pl_df$position %in% c('DT', 'DE'),
'DL',
ifelse(pl_df$position %in% c('ILB', 'LB', 'MLB', 'OLB'),
'LB',
'DB')
)
defence_df <- defence_df[defence_df$enter > 0.0,]
p2 <- ggplot(defence_df, aes(as.factor(category), average)) +
geom_point(mapping=aes(colour=as.factor(position)), position='jitter', alpha=0.5) +
geom_boxplot(mapping=aes(group=as.factor(category)), alpha=0.5, outlier.size = -Inf) +
ggtitle("Average distance") +
xlab("Role") +
ylab("Distance") +
labs(colour="Category")
ggplotly(p2)
## Warning: `group_by_()` is deprecated as of dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
Из данного графика мы видим, что игроки DL чаще остальных стараются держать короткое расстояние до противника, это обусловлено их позицией на расстановках - эти игроки первые пересекают линию скримиджа. LB держат более стабильную дистанцию - их задача пробиться к QB. И наконец DB имеют больший разброс по расстояниям так как к ним относятся еще игроки Safety, которые обычно стоят позади. Если разбирать по подкатегориям то сразу видно, что среди DB игроки, которые держат наименьшую дистанцию - CB, те, кто закрывают ресиверов - их задача держать WR близко к себе.
d1 <- density(pl_df$average)
plot(d1, main="Density for average distance", xlab="Value", ylab="Density")
Мы получаем что пик среднего расстояния приходится на 5 ярдов. Другой пик означает незаполненые значения.
d2 <- density(pl_df$minDist)
plot(d2, main="Density for minimum distance", xlab="Value", ylab="Density")
А для минимальных расстояний мы получаем, что график имеет два максимума - это значения, где защитник повалил соперника и расстояние около 1 ярда и где он его прикрывает ~ 3 ярда.
Таким образом на основе графиков плотности мы видим, что наибольшая эффективность защиты достигается при тактике короткой дистанции.